public class Test {



    //什么是面向对象
    //什么是面向过程
    //什么是类和对象
    //class 类名 {
    // 属性
    // 行为
    // }
    //通过类可以实例化对象，关键字new。对象就是一个实体
    //类--》类型  自定义类型



    public static void main1(String[] args) {
        Person p1= new Person();
        //person是个引用变量，引用指向对象,存储变量的地址
        //此处name和age并没有赋值，但是此时并不会报错，因为他们属于成员变量，这里编译器会自动给他们默认值
        //如果是引用类型  默认为null，int，float是0，0.0.
        //boolean是false char

        p1.show();
        p1.name = "lisi";
        p1.age = 10;
        p1.show();

        System.out.println("++++++++++++++++");
        Person p2 = new Person();
        p2.name = "zhangsan";
        p2.age = 19;
        //通过对象的引用访问对象的属性和方法

        //难点：怎么准确的抽象出一个类。


    }

    public static void main2(String[] args) {
        Person p1 = new Person();
        p1.name = "lisi";
        p1.age = 19;
        Person p2 = null;//不指向任何对象，因此此不能通过篇
        //访问姓名和年龄.一个引用赋值为null，代表不指向任何对象

        Person p3 = new Person();
        p3 = p1;
        p3.show();
        //引用能指向引用吗？不能。引用一定指向对象
        //这个代表了p3指向了p1指向的对象

        //一个引用能不能指向多个对象？ 不能，一个引用只能指向一个对象

        Person p4 = new Person();
        p4 = new Person();
        p4 = new Person();
        p4 = new Person();
        p4 = new Person();
        //p4只会接收到最后一个对象的地址

        //总结：引用变量为null说明该引用不指向人和对象
        //引用不可以指向引用
        //一个引用只能指向一个对象

    }
    //this引用

    public static void main(String[] args) {

    }

}
class DateUtil {
    public int year;
    public int month;
    public int day;

    public void setDate(DateUtil this,int y,int m,int d) {
        this.year = y;
        this.month = m;
        this.day = d;
    }
    //在方法中，this作为隐式参数，编译器会自动帮我们传值
    //每个成员方法的第一个参数，默认是this
    //我们以后要习惯用this
    public void setDate1(DateUtil this,int year,int month,int day) {
        year = year;
        month = month;
        day = day;
    }
    //this指向当前引用

    //1---》形参名和成员变量同名时？  局部变量优先，局部变量自己给自己赋值，没有修改到引用变量的值
    //必须加this，代表形参给当前的对象的成员变量赋值

    //2---》this调用构造方法
    //构造方法是什么？对象的构造和初始化？局部变量必须初始化，成员变量可以不用初始化
    //如何初始化对象？写set方法，麻烦。或者一个一个初始化
    //java语法提供了一个在创建的同时初始化的方法---》构造方法

    //构造方法非常特殊，这个方法没有返回值，方法名和类名一致。
    //如果不写构造方法，编译器会自动提供无参构造
    //如果写了，编译器就不会提供了，编译器会使用自己写的。
    //构造方法在对象的生命周期内只会被调用一次
    //调用构造方法会自动帮助初始化
    //无参构造和实参构造重载
    //方法名相同  参数列表不同  方法名相同
    //构造方法默认没有参数，不用加void ，加void不会报错，但是此时已经不是构造方法了
    //不管你写了啥构造方法，只要写了，Java都不会给你提供不带参数的构造方法了
    //当我们调用完成构造方法，对象就生成了。但是在调用构造方法时，为什么可以用this呢
    //对象的创建分成几步
    //为对象分配内存空间（this已经有了）
    //调用合适的构造方法（在调用构造前，内存空间地址已经分配好来）

    //名字必须和类名相同
    //无返回值，设置为void也不行
    //构造方法只能调用一次
    //构造方法可以重载
    //如果没有定义，默认生成无参构造
    //构造可以调用构造,但是要放在构造方法第一行。格式 this（参数）；
    //只有在构造内部才能调用构造，普通方法不能调用构造，而且必须放在构造第一行。
    //构造互相调用不能形成环。



    public DateUtil() {
        this(2000,10,24);
        System.out.println("无参构造");
    }

    public DateUtil(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("三参构造");
    }

    //3--》this调用方法
    //this.成员方法  在方法内部使用this访问构造方法，在构造方法也能调用普通方法
    //this不能调用静态的成员方法和属性
    //this.data
    //this.func()
    //this()


    //this引用的特点
    //静态方法里面不能用this
    //

    public void show() {
        System.out.println("年" + year + "月" + month + "日" + day);
    }

    public static void main1(String[] args) {
        DateUtil d1 = new DateUtil();
        d1.setDate(2022,10,27);
        d1.show();
        System.out.println("++++++++++++++++++++");
        DateUtil d2 = new DateUtil();
        d2.setDate(2022,10,27);
        d2.show();
        System.out.println("+++++++++++++++++++");
        DateUtil d3 = new DateUtil();
        d3.setDate(2022,10,27);
        d3.show();

        //方法前面是那个引用，就调用那个对象的方法
        //谁调用方法，方法里的隐式参数this就是谁

    }

    public static void main(String[] args) {
        DateUtil dateUtil = new DateUtil();
        DateUtil d = new DateUtil(2000,12,24);
    }

}

//成员变量的初始化---》就地初始化1
//set方法初始化？？？
//默认初始化
//构造方法初始化

//Java里面没有全局变量的概念，只有局部变量的概念
//成员变量和局部变量
//引用变量和基本类型

//生命周期：成员变量 对象创建，变量创建，对象销毁，变量销毁
//局部变量  和方法的声明周期一致


class Person {
    public String name;//姓名
    public int age;//年龄

    public void eat() {
        System.out.println(name + "吃饭");
    }

    public void play() {
        System.out.println(name + "play");
    }

    //
    public void show() {
        System.out.println("名字" + name + "年龄" + age);
    }
}


